Introducción

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Inventore itaque iure ipsum sunt omnis quis vel doloremque provident, nam perspiciatis id soluta quos iste. Ratione facere nesciunt unde. Repellat saepe quo veniam corporis reprehenderit dolores eveniet voluptate aperiam eaque officia? Sed aperiam et eius obcaecati. Similique ex quod quae rerum ad assumenda enim possimus id tempore, perferendis incidunt explicabo facilis laudantium nulla temporibus deserunt est ratione corporis sequi aliquam nostrum consequuntur! Culpa officia, autem veniam ratione ut consequuntur quas a, neque sint facere fugit fugiat exercitationem recusandae magni quam cumque repellendus illo facilis blanditiis eligendi consequatur ducimus id. Error, facilis?

1. Datos

Los datos fueron obtenidos de la plataforma medata, la base de datos cuenta con un total de 270.765 observaciones con 18 variables, datos obtenidos en el periodo comprendido entre el año 2014 y 2020, en la siguiente sección realizamos la limpieza de los datos y organización de los mismos para realizar un análisis descriptivo de estos y posteriormente realizar los agrupamiento solicitados y la predicción de accidentalidad.

A continuación, se hace la revisión y descripción de cada variable con el fin de encontrar datos inconsistentes, esto se realizo revisando el csv en excel para datos inconsistentes y en R para los datos faltantes.

AÑO: año de ocurrencia del incidente. (2014 hasta 2016)

CBML: es el código catastral que corresponde al código comuna, barrio, manzana, lote catastral de un predio. En este encontramos 18.156 vacíos y adicionalmente tiene 962 registros con caracteres extraños como: AUC1, AUC2, Inst_14, Inst_16, Inst_18, Inst_19, Sin Inf, SN01, para un total de 19.118 registros mal estructurados o vacíos.

CLASE_ACCIDENTE: clasificación del IPAT (Informe Policivo de Accidente de tránsito) sobre la clase de accidente de tránsito, hay 5 tipos de clasificación, choque, atropello, volcamiento, caída de ocupante, incendio y adicional se hay otra clasificación denominada como “otro”. En esta variable encontramos un total de 6 datos vacíos los cuales se cambiarán por “otro”.

DISEÑO: esta corresponde al sitio donde ocurrió el accidente (Ciclorruta, Glorieta, Intersección, Lote o Predio, Paso a Nivel, Paso Elevado, Paso Inferior, Pontón, Puente, Tramo de vía, Túnel, Vía peatonal). En esta encontramos 1.148 vacíos los cuales se reemplazarán por “otro”.

BARRIO: barrio de ocurrencia del incidente vial, en este encontramos 19.006 vacíos,Además se tienen 1.822 registros adicionales con carácteres como: números entre 0 y 9.086, AUC1, AUC2, Inst, Sin Inf, Sin nombre.

COMUNA: denominación con la cual se identifica cada Comuna o Corregimiento, en este encontramos 12.798 vacíos ademas se tienen 7.064 registros adicionales con carácteres como: No Georef, 0, In, AU, Sin Inf, SN.

NUMCOMUNA: número de la comuna en la que ocurrió incidente vial, se encontraron 20.116 registros adicionales con caracteres como: AU, In, Sin Inf, SN.

LOCATION: fuente de información con la cual se realizó la geo codificación, contiene la latitud y longitud, Posteriormente será separada en dos variables.

X: coordenada X en metros del accidente, en sistema de coordenadas MAGNA Medellín Local.

Y: coordenada Y en metros del accidente, en sistema de coordenadas MAGNA Medellín Local.

NRO_RADICADO: consecutivo que asigna UNE, según el orden de llegada de los expedientes para su diligenciamiento.

MES: mes de ocurrencia del incidente vial. Esta variable no se modifica.

GRAVEDAD_ACCIDENTE: clasificación del IPAT (Informe Policial de Accidentes de Tránsito) sobre la gravedad del accidente, corresponde al resultado más grave presentado en el accidente. Daños materiales “Sólo daños”, accidente con heridos “Herido”, accidente con muertos “Muerto”,en esta variable se cambia la codificación a UTF-8

FECHA_ACCIDENTES: fecha de los accidente (formato YYYY-MM-DD hh:mi:ss), proviene del IPAT (Informe Policial de accidentes de Tránsito)

FECHA_ACCIDENTE: fecha del accidente, proviene del IPAT (Informe Policial de accidente de Tránsito) esta variable posteriormente se elimina debido a que proporciona menos información que la variable FECHA_ACCIDENTES.

EXPEDIENTE: consecutivo que asigna UNE, según el orden de llegada de los expedientes para su diligenciamiento. Esta variable posteriormente se elimina.

DIRECCION ENCASILLADA: dirección encasillada que entrega el geo codificador. Esta variable se elimina.

DIRECCION: dirección donde ocurrió el incidente. Esta variable no se modifica.

NRO_RADICADO: consecutivo que asigna UNE, según el orden de llegada de los expedientes para su diligenciamiento.

1.1 Integración de datos Geo-Medellín y depuración.

En esta sección hicimos integración entre los datos de nuestra base de datos y los datos encontrados en la plataforma Geo Medellín, esto con el fin de encontrar datos faltantes respecto a barrios, comunas, posteriormente realizaremos la depuración de la base de datos, donde eliminaremos las observaciones con datos faltantes irrecuperables y variables que no sean necesarias para el contexto de nuestro análisis.

1.1.1 Integración de datos Geo-Medellín

Para la integración de los datos usamos lo datos contenidos en la pagina web Geo medellín, de nuestra base de datos usamos la variable CBML y con los primeros 4 dígitos poder obtener los datos faltantes de barrio y comuna cruzando los datos entre nuestra base de datos y la de geo Medellín.

1.1.2 Depuración

Luego de hacer la revisión de las variables y eliminar los datos irrecuperables, procedemos a eliminar las variables temporales que creamos y otras variables presentes en la base de datos las cuales consideramos que no son necesarias para realizar el proyecto.

1.1.3 Días feriados

Para las fechas especiales se crean dos nuevas variables; FESTIVIDAD y TIPO_FESTIVIDAD. Estas variables provienen de una base de datos externa que se adiciona a la base de análisis y abarca los días feriados en Colombia desde 2014 hasta 2021.

FESTIVIDAD: contiene dos etiquetas (SI/NO). SI: cuando hay festividad para ese día. NO: cuando no hay festividad para ese día,

TIPO_FESTIVIDAD: contiene seis tipos de festividad:
FESTIVO: día feriado.
NAVIDAD: 24,25 y 31 de diciembre.
SEM_SANTA: toda la semana santa, desde el lunes hasta el domingo.
BRUJAS: 31 de octubre.
MADRES: el día de madres designado para el año respectivo.
NUEVO: primero de enero de cada año.

Luego de realizar todo el pre procesamiento a la base de datos, podemos observar mediante la siguiente tabla cual fue el resultado final.





2. Análisis descriptivo

En esta sección realizaremos el análisis descriptivo por las variables que consideramos que representan una descripción de la distribución de los datos a lo largo del periodo contenido, con el fin de ver cuál es el comportamiento de los datos.

2.1 Accidentes mensuales por Año

2.2 Accidentes por día de la semana

2.3 Accidentes por mes

2.4 Accidentes por año

2.5 Accidentes por comuna

2.6 Accidentes por gravedad

2.7 Accidentes por tipo de festividad

Además de verificar los accidentes por tipo de festividad, también haremos revisión de la distribución de los datos respecto a si el día del accidente era o no festivo.

LS0tDQp0aXRsZTogIlRyYWJham8gMyINCmF1dGhvcjogIkRleW5lciBMw7NwZXogUGluZWRhLCBEYW5pZWwgdG9ycmVzIGFndWlycmUsIEFuZHJlcyBjYW1pbG8gZ2FyY2lhLCB3aWxtYXIsIGFtaWxkZXIiDQpkYXRlOiAiMTMvMTEvMjAyMiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IHNwYWNlbGFiDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGFwc2U6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJywgZWNobz1GfQ0KIyBMaWJyZXJpYXMNCg0KbGlicmFyeShzdHJpbmdyKTsgDQpsaWJyYXJ5KGRwbHlyKTsgDQpsaWJyYXJ5KHJnZGFsKTsgDQpsaWJyYXJ5KHBseXIpOyANCmxpYnJhcnkodGlkeXZlcnNlKTsgDQpsaWJyYXJ5KGthYmxlRXh0cmEpOyANCmxpYnJhcnkobHVicmlkYXRlKTsgDQpsaWJyYXJ5KGdncGxvdDIpOyANCmxpYnJhcnkocGxvdGx5KTsgDQpsaWJyYXJ5KGdncHVicik7DQpsaWJyYXJ5KGR1bW1pZXMpOw0KbGlicmFyeShyZWFkeGwpOw0KbGlicmFyeShzZik7DQpsaWJyYXJ5KEdHYWxseSk7DQpsaWJyYXJ5KGNhcik7DQpsaWJyYXJ5KE1MbWV0cmljcyk7DQpsaWJyYXJ5KHdvcmRjbG91ZCk7DQpsaWJyYXJ5KGdwbG90cyk7DQpsaWJyYXJ5KFIudXRpbHMpOw0KbGlicmFyeSh0bSk7DQpsaWJyYXJ5KERlc2NUb29scyk7DQpsaWJyYXJ5KHJhc3Rlcik7DQpsaWJyYXJ5KG1jbHVzdCk7DQpsaWJyYXJ5KGdlb3NwaGVyZSk7DQpsaWJyYXJ5KE5iQ2x1c3QpOw0KbGlicmFyeShmYWN0b2V4dHJhKTsNCmxpYnJhcnkodmVnYW4pOw0KbGlicmFyeShxcGNSKTsNCmxpYnJhcnkobGVhZmxldCkNCmBgYA0KDQojIyBJbnRyb2R1Y2Npw7NuDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkxvcmVtIGlwc3VtLCBkb2xvciBzaXQgYW1ldCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LiBJbnZlbnRvcmUgaXRhcXVlIGl1cmUgaXBzdW0gc3VudCBvbW5pcyBxdWlzIHZlbCBkb2xvcmVtcXVlIHByb3ZpZGVudCwgbmFtIHBlcnNwaWNpYXRpcyBpZCBzb2x1dGEgcXVvcyBpc3RlLiBSYXRpb25lIGZhY2VyZSBuZXNjaXVudCB1bmRlLiBSZXBlbGxhdCBzYWVwZSBxdW8gdmVuaWFtIGNvcnBvcmlzIHJlcHJlaGVuZGVyaXQgZG9sb3JlcyBldmVuaWV0IHZvbHVwdGF0ZSBhcGVyaWFtIGVhcXVlIG9mZmljaWE/IFNlZCBhcGVyaWFtIGV0IGVpdXMgb2JjYWVjYXRpLiBTaW1pbGlxdWUgZXggcXVvZCBxdWFlIHJlcnVtIGFkIGFzc3VtZW5kYSBlbmltIHBvc3NpbXVzIGlkIHRlbXBvcmUsIHBlcmZlcmVuZGlzIGluY2lkdW50IGV4cGxpY2FibyBmYWNpbGlzIGxhdWRhbnRpdW0gbnVsbGEgdGVtcG9yaWJ1cyBkZXNlcnVudCBlc3QgcmF0aW9uZSBjb3Jwb3JpcyBzZXF1aSBhbGlxdWFtIG5vc3RydW0gY29uc2VxdXVudHVyISBDdWxwYSBvZmZpY2lhLCBhdXRlbSB2ZW5pYW0gcmF0aW9uZSB1dCBjb25zZXF1dW50dXIgcXVhcyBhLCBuZXF1ZSBzaW50IGZhY2VyZSBmdWdpdCBmdWdpYXQgZXhlcmNpdGF0aW9uZW0gcmVjdXNhbmRhZSBtYWduaSBxdWFtIGN1bXF1ZSByZXBlbGxlbmR1cyBpbGxvIGZhY2lsaXMgYmxhbmRpdGlpcyBlbGlnZW5kaSBjb25zZXF1YXR1ciBkdWNpbXVzIGlkLiBFcnJvciwgZmFjaWxpcz8NCjwvZGl2Pg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnLCBlY2hvPUZ9DQojTGVjdHVyYSBkZSBsYSBiYXNlIGRlIGRhdG9zDQpiZCA8LSByZWFkLmNzdigiLi9kYXRvcy9pbmNpZGVudGVzX3ZpYWxlcy5jc3YiLCBkZWM9IiwiLCBoZWFkZXI9VCxzZXA9IjsiKQ0KYGBgDQoNCiMjIDEuIERhdG9zDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkxvcyBkYXRvcyBmdWVyb24gb2J0ZW5pZG9zIGRlIGxhIHBsYXRhZm9ybWEgW21lZGF0YV0oaHR0cDovL21lZGF0YS5nb3YuY28vZGF0YXNldC9pbmNpZGVudGVzLXZpYWxlcyksIGxhIGJhc2UgZGUgZGF0b3MgY3VlbnRhIGNvbiB1biB0b3RhbCBkZSAyNzAuNzY1IG9ic2VydmFjaW9uZXMgY29uIDE4IHZhcmlhYmxlcywgZGF0b3Mgb2J0ZW5pZG9zIGVuIGVsIHBlcmlvZG8gY29tcHJlbmRpZG8gZW50cmUgZWwgYcOxbyAyMDE0IHkgMjAyMCwgZW4gbGEgc2lndWllbnRlIHNlY2Npw7NuIHJlYWxpemFtb3MgbGEgbGltcGllemEgZGUgbG9zIGRhdG9zIHkgb3JnYW5pemFjacOzbiBkZSBsb3MgbWlzbW9zIHBhcmEgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGRlc2NyaXB0aXZvIGRlIGVzdG9zIHkgcG9zdGVyaW9ybWVudGUgcmVhbGl6YXIgbG9zIGFncnVwYW1pZW50byBzb2xpY2l0YWRvcyB5IGxhIHByZWRpY2Npw7NuIGRlIGFjY2lkZW50YWxpZGFkLg0KPC9kaXY+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0NCiNNb3N0cmFtb3MgbGFzIHByaW1lcmFzIDUgb2JzZXJ2YWNpb25lcyBkZSBsYSBiYXNlIGRlIGRhdG9zDQpoZWFkKGJkLG49NSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCiNTZSBjYW1iaWEgZWwgZm9ybWF0YSBkZSBsYSBmZWNoYSBkZWwgYWNjaWRlbnRlDQpiZCRGRUNIQV9BQ0NJREVOVEUgPC0gYXMuRGF0ZShiZCRGRUNIQV9BQ0NJREVOVEUsIGZvcm1hdD0iJWQvJW0vJVkiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFICwgcmVzdWx0cz0gJ2hpZGUnfQ0KI1JldmlzYW1vcyBxdWUgdmFyaWFibGVzIGNvbnRpZW5lbiB2YWxvcmVzIHZhY2lvcw0KY29sU3Vtcyhpcy5uYShiZCl8YmQ9PSIiKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KQSBjb250aW51YWNpw7NuLCBzZSBoYWNlIGxhIHJldmlzacOzbiB5IGRlc2NyaXBjacOzbiBkZSBjYWRhIHZhcmlhYmxlIGNvbiBlbCBmaW4gZGUgZW5jb250cmFyIGRhdG9zIGluY29uc2lzdGVudGVzLCBlc3RvIHNlIHJlYWxpem8gcmV2aXNhbmRvIGVsIGNzdiBlbiBleGNlbCBwYXJhIGRhdG9zIGluY29uc2lzdGVudGVzIHkgZW4gUiBwYXJhIGxvcyBkYXRvcyBmYWx0YW50ZXMuDQoNCioqQcORTzoqKiBhw7FvIGRlIG9jdXJyZW5jaWEgZGVsIGluY2lkZW50ZS4gKDIwMTQgaGFzdGEgMjAxNikNCg0KKipDQk1MOioqIGVzIGVsIGPDs2RpZ28gY2F0YXN0cmFsIHF1ZSBjb3JyZXNwb25kZSBhbCBjw7NkaWdvIGNvbXVuYSwgYmFycmlvLCBtYW56YW5hLCBsb3RlIGNhdGFzdHJhbCBkZSB1biBwcmVkaW8uIEVuIGVzdGUgZW5jb250cmFtb3MgMTguMTU2IHZhY8Otb3MgeSBhZGljaW9uYWxtZW50ZSB0aWVuZSA5NjIgcmVnaXN0cm9zIGNvbiBjYXJhY3RlcmVzIGV4dHJhw7FvcyBjb21vOiBBVUMxLCBBVUMyLCBJbnN0XzE0LCBJbnN0XzE2LCBJbnN0XzE4LCBJbnN0XzE5LCBTaW4gSW5mLCBTTjAxLCBwYXJhIHVuIHRvdGFsIGRlIDE5LjExOCByZWdpc3Ryb3MgbWFsIGVzdHJ1Y3R1cmFkb3MgbyB2YWPDrW9zLg0KDQoqKkNMQVNFX0FDQ0lERU5URToqKiBjbGFzaWZpY2FjacOzbiBkZWwgSVBBVCAoSW5mb3JtZSBQb2xpY2l2byBkZSBBY2NpZGVudGUgZGUgdHLDoW5zaXRvKSBzb2JyZSBsYSBjbGFzZSBkZSBhY2NpZGVudGUgZGUgdHLDoW5zaXRvLCBoYXkgNSB0aXBvcyBkZSBjbGFzaWZpY2FjacOzbiwgY2hvcXVlLCBhdHJvcGVsbG8sIHZvbGNhbWllbnRvLCBjYcOtZGEgZGUgb2N1cGFudGUsIGluY2VuZGlvIHkgYWRpY2lvbmFsIHNlIGhheSBvdHJhIGNsYXNpZmljYWNpw7NuIGRlbm9taW5hZGEgY29tbyDigJxvdHJv4oCdLiBFbiBlc3RhIHZhcmlhYmxlIGVuY29udHJhbW9zIHVuIHRvdGFsIGRlIDYgZGF0b3MgdmFjw61vcyBsb3MgY3VhbGVzIHNlIGNhbWJpYXLDoW4gcG9yIOKAnG90cm/igJ0uDQoNCioqRElTRcORTzoqKiBlc3RhIGNvcnJlc3BvbmRlIGFsIHNpdGlvIGRvbmRlIG9jdXJyacOzIGVsIGFjY2lkZW50ZSAoQ2ljbG9ycnV0YSwgR2xvcmlldGEsIEludGVyc2VjY2nDs24sIExvdGUgbyBQcmVkaW8sIFBhc28gYSBOaXZlbCwgUGFzbyBFbGV2YWRvLCBQYXNvIEluZmVyaW9yLCBQb250w7NuLCBQdWVudGUsIFRyYW1vIGRlIHbDrWEsIFTDum5lbCwgVsOtYSBwZWF0b25hbCkuIEVuIGVzdGEgZW5jb250cmFtb3MgMS4xNDggdmFjw61vcyBsb3MgY3VhbGVzIHNlIHJlZW1wbGF6YXLDoW4gcG9yIOKAnG90cm/igJ0uDQoNCioqQkFSUklPOioqIGJhcnJpbyBkZSBvY3VycmVuY2lhIGRlbCBpbmNpZGVudGUgdmlhbCwgZW4gZXN0ZSBlbmNvbnRyYW1vcyAxOS4wMDYgdmFjw61vcyxBZGVtw6FzIHNlIHRpZW5lbiAxLjgyMiByZWdpc3Ryb3MgYWRpY2lvbmFsZXMgY29uIGNhcsOhY3RlcmVzIGNvbW86IG7Dum1lcm9zIGVudHJlIDAgeSA5LjA4NiwgQVVDMSwgQVVDMiwgSW5zdCwgU2luIEluZiwgU2luIG5vbWJyZS4NCg0KKipDT01VTkE6KiogZGVub21pbmFjacOzbiBjb24gbGEgY3VhbCBzZSBpZGVudGlmaWNhIGNhZGEgQ29tdW5hIG8gQ29ycmVnaW1pZW50bywgZW4gZXN0ZSBlbmNvbnRyYW1vcyAxMi43OTggdmFjw61vcyBhZGVtYXMgc2UgdGllbmVuIDcuMDY0IHJlZ2lzdHJvcyBhZGljaW9uYWxlcyBjb24gY2Fyw6FjdGVyZXMgY29tbzogTm8gR2VvcmVmLCAwLCBJbiwgQVUsIFNpbiBJbmYsIFNOLg0KDQoqKk5VTUNPTVVOQToqKiBuw7ptZXJvIGRlIGxhIGNvbXVuYSBlbiBsYSBxdWUgb2N1cnJpw7MgaW5jaWRlbnRlIHZpYWwsIHNlIGVuY29udHJhcm9uIDIwLjExNiByZWdpc3Ryb3MgYWRpY2lvbmFsZXMgY29uIGNhcmFjdGVyZXMgY29tbzogQVUsIEluLCBTaW4gSW5mLCBTTi4NCg0KKipMT0NBVElPTjoqKiBmdWVudGUgZGUgaW5mb3JtYWNpw7NuIGNvbiBsYSBjdWFsIHNlIHJlYWxpesOzIGxhIGdlbyBjb2RpZmljYWNpw7NuLCBjb250aWVuZSBsYSBsYXRpdHVkIHkgbG9uZ2l0dWQsIFBvc3Rlcmlvcm1lbnRlIHNlcsOhIHNlcGFyYWRhIGVuIGRvcyB2YXJpYWJsZXMuDQoNCioqWDoqKiBjb29yZGVuYWRhIFggZW4gbWV0cm9zIGRlbCBhY2NpZGVudGUsIGVuIHNpc3RlbWEgZGUgY29vcmRlbmFkYXMgTUFHTkEgTWVkZWxsw61uIExvY2FsLg0KDQoqKlk6KiogY29vcmRlbmFkYSBZIGVuIG1ldHJvcyBkZWwgYWNjaWRlbnRlLCBlbiBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIE1BR05BIE1lZGVsbMOtbiBMb2NhbC4NCg0KKipOUk9fUkFESUNBRE86KiogY29uc2VjdXRpdm8gcXVlIGFzaWduYSBVTkUsIHNlZ8O6biBlbCBvcmRlbiBkZSBsbGVnYWRhIGRlIGxvcyBleHBlZGllbnRlcyBwYXJhIHN1IGRpbGlnZW5jaWFtaWVudG8uDQoNCioqTUVTOioqIG1lcyBkZSBvY3VycmVuY2lhIGRlbCBpbmNpZGVudGUgdmlhbC4gRXN0YSB2YXJpYWJsZSBubyBzZSBtb2RpZmljYS4NCg0KKipHUkFWRURBRF9BQ0NJREVOVEU6KiogY2xhc2lmaWNhY2nDs24gZGVsIElQQVQgKEluZm9ybWUgUG9saWNpYWwgZGUgQWNjaWRlbnRlcyBkZSBUcsOhbnNpdG8pIHNvYnJlIGxhIGdyYXZlZGFkIGRlbCBhY2NpZGVudGUsIGNvcnJlc3BvbmRlIGFsIHJlc3VsdGFkbyBtw6FzIGdyYXZlIHByZXNlbnRhZG8gZW4gZWwgYWNjaWRlbnRlLiBEYcOxb3MgbWF0ZXJpYWxlcyDigJxTw7NsbyBkYcOxb3PigJ0sIGFjY2lkZW50ZSBjb24gaGVyaWRvcyDigJxIZXJpZG/igJ0sIGFjY2lkZW50ZSBjb24gbXVlcnRvcyDigJxNdWVydG/igJ0sZW4gZXN0YSB2YXJpYWJsZSBzZSBjYW1iaWEgbGEgY29kaWZpY2FjacOzbiBhIFVURi04DQoNCioqRkVDSEFfQUNDSURFTlRFUzoqKiBmZWNoYSBkZSBsb3MgYWNjaWRlbnRlIChmb3JtYXRvIFlZWVktTU0tREQgaGg6bWk6c3MpLCBwcm92aWVuZSBkZWwgSVBBVCAoSW5mb3JtZSBQb2xpY2lhbCBkZSBhY2NpZGVudGVzIGRlIFRyw6Fuc2l0bykNCg0KKipGRUNIQV9BQ0NJREVOVEU6KiogZmVjaGEgZGVsIGFjY2lkZW50ZSwgcHJvdmllbmUgZGVsIElQQVQgKEluZm9ybWUgUG9saWNpYWwgZGUgYWNjaWRlbnRlIGRlIFRyw6Fuc2l0bykgZXN0YSB2YXJpYWJsZSBwb3N0ZXJpb3JtZW50ZSBzZSBlbGltaW5hIGRlYmlkbyBhIHF1ZSBwcm9wb3JjaW9uYSBtZW5vcyBpbmZvcm1hY2nDs24gcXVlIGxhIHZhcmlhYmxlIEZFQ0hBX0FDQ0lERU5URVMuDQoNCioqRVhQRURJRU5URToqKiBjb25zZWN1dGl2byBxdWUgYXNpZ25hIFVORSwgc2Vnw7puIGVsIG9yZGVuIGRlIGxsZWdhZGEgZGUgbG9zIGV4cGVkaWVudGVzIHBhcmEgc3UgZGlsaWdlbmNpYW1pZW50by4gRXN0YSB2YXJpYWJsZSBwb3N0ZXJpb3JtZW50ZSBzZSBlbGltaW5hLg0KDQoqKkRJUkVDQ0lPTiBFTkNBU0lMTEFEQToqKiBkaXJlY2Npw7NuIGVuY2FzaWxsYWRhIHF1ZSBlbnRyZWdhIGVsIGdlbyBjb2RpZmljYWRvci4gRXN0YSB2YXJpYWJsZSBzZSBlbGltaW5hLg0KDQoqKkRJUkVDQ0lPTjoqKiBkaXJlY2Npw7NuIGRvbmRlIG9jdXJyacOzIGVsIGluY2lkZW50ZS4gRXN0YSB2YXJpYWJsZSBubyBzZSBtb2RpZmljYS4NCg0KKipOUk9fUkFESUNBRE86KiogY29uc2VjdXRpdm8gcXVlIGFzaWduYSBVTkUsIHNlZ8O6biBlbCBvcmRlbiBkZSBsbGVnYWRhIGRlIGxvcyBleHBlZGllbnRlcyBwYXJhIHN1IGRpbGlnZW5jaWFtaWVudG8uDQoNCjwvZGl2Pg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZScsIGVjaG89RkFMU0V9DQojIHJlZW1wbGF6YW1vcyBsb3MgZGF0b3MgdmFjaW9zIGRlIGxhIHZhcmlhYmxlIENMQVNFX0FDQ0lERU5URQ0KDQojQ2FtYmlhciBsb3MgZGF0b3MgdmFjaW9zIHBvciAib3RybyIuDQpiZCRDTEFTRV9BQ0NJREVOVEUgPC0gaWZlbHNlKGJkJENMQVNFX0FDQ0lERU5URSA9PSAiIiwiT3RybyIsYmQkQ0xBU0VfQUNDSURFTlRFKSANCg0KI0NvcnJlY2lvbiBkZSB0aWxkZXMNCmJkJENMQVNFX0FDQ0lERU5URSA8LSBpY29udihiZCRDTEFTRV9BQ0NJREVOVEUsIGZyb20gPSAiVVRGLTgiLCB0byA9ICJBU0NJSS8vVFJBTlNMSVQiKSANCg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZScsIGVjaG89Rn0NCiMgQ2FtYmlhciBkYXRvcyB2YWNpb3MgZGUgbGEgdmFyaWFibGUgRElTRU5PDQoNCiNDYW1iaWFyIGRhdG9zIHZhY2lvcyBwb3IgIm5vIGVzcGVjaWZpY2FkbyINCmJkJERJU0VOTyA8LSBpZmVsc2UoYmQkRElTRU5PID09ICIiLCJvdHJvIixiZCRESVNFTk8pDQoNCiNDb3JyZWNjaW9uIGRlIHRpbGRlcw0KYmQkRElTRU5PIDwtIGljb252KGJkJERJU0VOTywgZnJvbSA9ICJVVEYtOCIsdG89IkFTQ0lJLy9UUkFOU0xJVCIpIA0KDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQojQ3JlYW1vcyB1bmEgbnVldmEgdmFyaWFibGVzIHF1ZSBjb250aWVuZSBlbCBkaWEgZGUgbGEgc2VtYW5hIGVuIHF1ZSBvY3VycmlvIGVsIGFjY2lkZW50ZQ0KYmQkRElBX1NFTUFOQSA8LSBmb3JtYXQoYmQkRkVDSEFfQUNDSURFTlRFLCBmb3JtYXQ9IiVBIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30NCiNDcmVhbW9zIHVuYSBudWV2YSB2YXJpYWJsZXMgbGEgY3VhbCBjb250aWVuZSBsYSBob3JhIGRlbCBhY2NpZGVudGUNCmJkJEhPUkFfQUNDSURFTlRFIDwtIHN1YnN0cihiZCRGRUNIQV9BQ0NJREVOVEVTLHN0YXJ0ID0gMTIgLHN0b3AgPSAxOSkNCmBgYA0KDQojIyMgMS4xIEludGVncmFjacOzbiBkZSBkYXRvcyBHZW8tTWVkZWxsw61uIHkgZGVwdXJhY2nDs24uDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkVuIGVzdGEgc2VjY2nDs24gaGljaW1vcyBpbnRlZ3JhY2nDs24gZW50cmUgbG9zIGRhdG9zIGRlIG51ZXN0cmEgYmFzZSBkZSBkYXRvcyB5IGxvcyBkYXRvcyBlbmNvbnRyYWRvcyBlbiBsYSBwbGF0YWZvcm1hIEdlbyBNZWRlbGzDrW4sIGVzdG8gY29uIGVsIGZpbiBkZSBlbmNvbnRyYXIgZGF0b3MgZmFsdGFudGVzIHJlc3BlY3RvIGEgYmFycmlvcywgY29tdW5hcywgcG9zdGVyaW9ybWVudGUgcmVhbGl6YXJlbW9zIGxhIGRlcHVyYWNpw7NuIGRlIGxhIGJhc2UgZGUgZGF0b3MsIGRvbmRlIGVsaW1pbmFyZW1vcyBsYXMgb2JzZXJ2YWNpb25lcyBjb24gZGF0b3MgZmFsdGFudGVzIGlycmVjdXBlcmFibGVzIHkgdmFyaWFibGVzIHF1ZSBubyBzZWFuIG5lY2VzYXJpYXMgcGFyYSBlbCBjb250ZXh0byBkZSBudWVzdHJvIGFuw6FsaXNpcy4NCjwvZGl2Pg0KDQojIyMjIDEuMS4xIEludGVncmFjacOzbiBkZSBkYXRvcyBHZW8tTWVkZWxsw61uDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NClBhcmEgbGEgaW50ZWdyYWNpw7NuIGRlIGxvcyBkYXRvcyB1c2Ftb3MgbG8gZGF0b3MgY29udGVuaWRvcyBlbiBsYSBwYWdpbmEgd2ViIFtHZW8gbWVkZWxsw61uXShodHRwczovL2dlb21lZGVsbGluLW0tbWVkZWxsaW4ub3BlbmRhdGEuYXJjZ2lzLmNvbS9kYXRhc2V0cy9NLU1lZGVsbGluOjpsaW1pdGUtYmFycmlvLXZlcmVkYS1jYXRhc3RyYWwvYWJvdXQpLCBkZSBudWVzdHJhIGJhc2UgZGUgZGF0b3MgdXNhbW9zIGxhIHZhcmlhYmxlIENCTUwgeSBjb24gbG9zIHByaW1lcm9zIDQgZMOtZ2l0b3MgcG9kZXIgb2J0ZW5lciBsb3MgZGF0b3MgZmFsdGFudGVzIGRlIGJhcnJpbyB5IGNvbXVuYSBjcnV6YW5kbyBsb3MgZGF0b3MgZW50cmUgbnVlc3RyYSBiYXNlIGRlIGRhdG9zIHkgbGEgZGUgZ2VvIE1lZGVsbMOtbi4NCjwvZGl2Pg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQ0KY2F0YXN0cm8gPC0gcmdkYWw6OnJlYWRPR1IoZHNuID0gIi4vZGF0b3MvQ2F0YXN0cm9fZ2RiLnNocCIsIGxheWVyID0gIkNhdGFzdHJvX2dkYiIpDQoNCg0KI3F1aXRhbW9zIGxvcyA5NjIgZGF0b3MgZGUgQ0JNTCBxdWUgZXN0w6FuIGVycmFkb3MgLS0tPiBxdWVkYW4gMjY5ODAzDQpiZCA8LSBiZFstd2hpY2goYmQkQ0JNTCAlaW4lIGMoIkFVQzEiLCJBVUMyIiwiSW5zdF8xNCIsIkluc3RfMTYiLCJJbnN0XzE4IiwiSW5zdF8xOSIsIlNpbiBJbmYiLCJTTjAxIikpLF0NCg0KI0NyZWFtb3MgdW4gbnVldmEgY29sdW1uYSBsbGFtYWRhIENCIGVuIGJkIHF1ZSBzb2xvIGRlamEgbG9zIHByaW1lcm9zIDQgZGlnaXRvcyBkZSBDQk1MIHBhcmEgYnVzY2FybG9zIGVuIGxhIGJkIGRlIGNhdGFzdHJvIHkgdHJhZXIgbGEgY29tdW5hIHkgZWwgYmFycmlvIGRlIGxvcyBxdWUgZXN0w6luIHZhY2lvcy4NCg0KYmQgPC0gbXV0YXRlKGJkLCBURU1QX0NCTUwgPSBzdHJfc3ViKENCTUwsMSw0KSkNCg0KI2FncmVnYW5kbyB1biBjZXJvIGFkZWxhbnRlIGEgbG9zIFRFTVBfQ0JNTCB5IGNyZWFuZG8gdW5hIG51ZXZhIGNvbHVtbmEgLS0+IFRFTVAyX0NCTUwNCmJkIDwtIG11dGF0ZShiZCwgVEVNUDJfQ0JNTD1pZmVsc2UobmNoYXIoVEVNUF9DQk1MKT09MyxwYXN0ZTAoIjAiLCBURU1QX0NCTUwpLFRFTVBfQ0JNTCksVEVNUF9DQk1MKQ0KDQpjb2xuYW1lcyhiZCkjbm9tYnJlcyBkZSBjb2x1bW5hcw0KDQojYmFzZSB1bmlmaWNhZGENCg0KYmQgPC0gaW5uZXJfam9pbihiZCwgZHBseXI6OnNlbGVjdChjYXRhc3Ryb0BkYXRhLENPRElHTyxOT01CUkVfQ09NLE5PTUJSRV9CQVIpLA0KICAgICAgICAgICAgICAgICAgYnkgPSBjKCJURU1QMl9DQk1MIiA9ICJDT0RJR08iKSkgI3F1ZWRhbiAyNTQwMDkgZGF0b3MNCg0KDQojUXVpdGFyIHJlcGV0aWRvcyBwb3IgZWwgaW5uZXJfam9pbg0KDQpiZCA8LSBiZCAlPiUgICAgICNjb252aXJ0aWVuZG8gZW4gZmFjdG9yIHBhcmEgdmVyIG1lam9yIGxvcyDDum5pY29zDQogIG11dGF0ZShOUk9fUkFESUNBRE8gPSBhcy5mYWN0b3IoTlJPX1JBRElDQURPKSkNCnJhZGljYWRvc19kdXBsaWNhZG9zIDwtIGJkJE5ST19SQURJQ0FET1tkdXBsaWNhdGVkKGJkJE5ST19SQURJQ0FETyldDQoNCnJhZGljYWRvc19kdXBsaWNhZG9zICAjdmVyaWZpY2FyIGR1cGxpY2Fkb3MNCnJlZ2lzdHJvc19yYWRfZHVwIDwtIGJkICU+JSANCiAgDQogIGZpbHRlcihOUk9fUkFESUNBRE8gJWluJSByYWRpY2Fkb3NfZHVwbGljYWRvcykgJT4lICAjDQogIGFycmFuZ2UoTlJPX1JBRElDQURPKQ0KI3JlZ2lzdHJvc19yYWRfZHVwDQoNCg0KYmRfdW5pZiA8LSBiZCAlPiUgDQogIGZpbHRlcighKE5ST19SQURJQ0FETyAlaW4lIHJhZGljYWRvc19kdXBsaWNhZG9zKSkNCiMyNDY0MTcgb2JzZXJ2YWNpb25lcyDDum5pY2FzDQoNCmBgYA0KDQojIyMjIDEuMS4yIERlcHVyYWNpw7NuDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkx1ZWdvIGRlIGhhY2VyIGxhIHJldmlzacOzbiBkZSBsYXMgdmFyaWFibGVzIHkgZWxpbWluYXIgbG9zIGRhdG9zIGlycmVjdXBlcmFibGVzLCBwcm9jZWRlbW9zIGEgZWxpbWluYXIgbGFzIHZhcmlhYmxlcyB0ZW1wb3JhbGVzIHF1ZSBjcmVhbW9zIHkgb3RyYXMgdmFyaWFibGVzIHByZXNlbnRlcyBlbiBsYSBiYXNlIGRlIGRhdG9zIGxhcyBjdWFsZXMgY29uc2lkZXJhbW9zIHF1ZSBubyBzb24gbmVjZXNhcmlhcyBwYXJhIHJlYWxpemFyIGVsIHByb3llY3RvLg0KPC9kaXY+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQ0KI0VsaW1pbmFjaW9uIGRlIHZhcmlhYmxlcyBubyBuZWNlc2FyaWFzDQoNCmJhc2UyIDwtIGRwbHlyOjpzZWxlY3QoYmRfdW5pZiwtWCwtWSwtQkFSUklPLC1DT01VTkEsLURJUkVDQ0lPTi5FTkNBU0lMTEFEQSwtQ0JNTCwtVEVNUF9DQk1MLC1URU1QMl9DQk1MLC1GRUNIQV9BQ0NJREVOVEVTLC1FWFBFRElFTlRFLC1OUk9fUkFESUNBRE8pDQoNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30NCiNDb3JyZWNjaW9uIGRlIHRpbGRlcw0KYmFzZTIkTk9NQlJFX0JBUiA8LSBpY29udihiYXNlMiROT01CUkVfQkFSLCBmcm9tID0gIlVURi04IiwgdG8gPSAiQVNDSUkvL1RSQU5TTElUIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30NCiNzZXBhcmFyIGVuIGRvcyBudWV2YXMgdmFyaWFibGVzIGxhIGxvbmdpdHVkIHkgbGF0aXR1ZCwgY29udGVuaWRvcyBlbiBsYSB2YXJpYWJsZXMgTE9DQVRJT04NCmJhc2UyIDwtIHNlcGFyYXRlKGJhc2UyLExPQ0FUSU9OLGMoIkxPTkdJVFVEIiwiTEFUSVRVRCIpLHNlcD0iLCIsY29udmVydD1UUlVFKQ0KDQojcXVpdGFtb3MgZWwgIlsiIGRlbCBkYXRvDQpiYXNlMiRMT05HSVRVRCA8LSBzdWJzdHJpbmcoYmFzZTIkTE9OR0lUVUQsIGZpcnN0ID0gMikNCg0KI0VsaW1pbmFyIGVsIGVzcGFjaW8gZW50cmUgbG9zIG51bWVyb3MNCmJhc2UyJExBVElUVUQgPC0gZ3N1YigiICIsIiIsIGJhc2UyJExBVElUVUQpDQoNCiNlbGltaW5hciBlbCB1bHRpbW8gZWxlbWVudG8gIl0iDQpiYXNlMiRMQVRJVFVEIDwtIGdzdWIoIl0iLCIiLCBiYXNlMiRMQVRJVFVEKSANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30NCiNyZW5vbWJyYXJlbW9zIGxhcyB2YXJpYWJsZXMNCmJhc2UyIDwtIHBseXI6OnJlbmFtZShiYXNlMiwgIGMoIkZFQ0hBX0FDQ0lERU5URSI9IkZFQ0hBIiwiTk9NQlJFX0JBUiI9IkJBUlJJTyIsIk5PTUJSRV9DT00iPSJDT01VTkEiLCJHUkFWRURBRF9BQ0NJREVOVEUiPSJHUkFWRURBRCIsIkNMQVNFX0FDQ0lERU5URSI9IkNMQVNFIikpDQpgYGANCg0KIyMjIyAxLjEuMyBEw61hcyBmZXJpYWRvcw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NClBhcmEgbGFzIGZlY2hhcyBlc3BlY2lhbGVzIHNlIGNyZWFuIGRvcyBudWV2YXMgdmFyaWFibGVzOyBgRkVTVElWSURBRGAgeSBgVElQT19GRVNUSVZJREFEYC4gRXN0YXMgdmFyaWFibGVzIHByb3ZpZW5lbiBkZSB1bmEgYmFzZSBkZSBkYXRvcyBleHRlcm5hIHF1ZSBzZSBhZGljaW9uYSBhIGxhIGJhc2UgZGUgYW7DoWxpc2lzIHkgYWJhcmNhIGxvcyBkw61hcyBmZXJpYWRvcyBlbiBDb2xvbWJpYSBkZXNkZSAyMDE0IGhhc3RhIDIwMjEuDQoNCioqRkVTVElWSURBRDoqKiBjb250aWVuZSBkb3MgZXRpcXVldGFzIChTSS9OTykuIFNJOiBjdWFuZG8gaGF5IGZlc3RpdmlkYWQgcGFyYSBlc2UgZMOtYS4gTk86IGN1YW5kbyBubyBoYXkgZmVzdGl2aWRhZCBwYXJhIGVzZSBkw61hLCAgDQoNCioqVElQT19GRVNUSVZJREFEOioqIGNvbnRpZW5lIHNlaXMgdGlwb3MgZGUgZmVzdGl2aWRhZDogIA0KKipGRVNUSVZPOioqIGTDrWEgZmVyaWFkby4gIA0KKipOQVZJREFEOioqIDI0LDI1IHkgMzEgZGUgZGljaWVtYnJlLiAgDQoqKlNFTV9TQU5UQToqKiB0b2RhIGxhIHNlbWFuYSBzYW50YSwgZGVzZGUgZWwgbHVuZXMgaGFzdGEgZWwgZG9taW5nby4gIA0KKipCUlVKQVM6KiogMzEgZGUgb2N0dWJyZS4gIA0KKipNQURSRVM6KiogZWwgZMOtYSBkZSBtYWRyZXMgZGVzaWduYWRvIHBhcmEgZWwgYcOxbyByZXNwZWN0aXZvLiAgDQoqKk5VRVZPOioqIHByaW1lcm8gZGUgZW5lcm8gZGUgY2FkYSBhw7FvLiAgDQo8L2Rpdj4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9DQpmZWNoYXNfZXNwZWNpYWxlcyA8LSByZWFkLmNzdigiLi9kYXRvcy9kaWFzX2Zlc3Rpdm9zLmNzdiIsIHNlcCA9ICIsIiwgaGVhZGVyID0gVCkNCmNsYXNzKGZlY2hhc19lc3BlY2lhbGVzJEZFQ0hBKQ0KZmVjaGFzX2VzcGVjaWFsZXMkRkVDSEEgPC0gYXMuRGF0ZShmZWNoYXNfZXNwZWNpYWxlcyRGRUNIQSwgZm9ybWF0PSIlZC8lbS8lWSIpDQpjbGFzcyhmZWNoYXNfZXNwZWNpYWxlcyRGRUNIQSkNCmBgYA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9DQojdW5pbW9zIGxhcyBmZWNoYXMgZXNwZWNpYWxlcyBhIGxhIGJhc2UgZGUgZGF0b3MNCmJhc2UyIDwtIG1lcmdlKHggPSBiYXNlMiwgeSA9IGZlY2hhc19lc3BlY2lhbGVzLCBieSA9ICJGRUNIQSIsIGFsbC54ID0gVCkNCmJhc2UyJEZFU1RJVklEQUQgPC0gaWZlbHNlKGlzLm5hKGJhc2UyJEZFU1RJVklEQUQpLCJOTyIsIlNJIikNCmJhc2UyJEZFU1RJVklEQUQgPC0gYXMuZmFjdG9yKGJhc2UyJEZFU1RJVklEQUQpDQpzdW1tYXJ5KGJhc2UyJEZFU1RJVklEQUQpDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQ0KI2FncmVnYW5kbyBzZW1hbmENCmJhc2UyIDwtIG11dGF0ZShiYXNlMiwgU0VNQU5BPWFzLmZhY3Rvcih3ZWVrKGJhc2UyJEZFQ0hBKSkpDQpiYXNlMiRTRU1BTkEgPC0gYXMuZmFjdG9yKGJhc2UyJFNFTUFOQSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30NCiNUaXBvIGRlIGZlc3RpdmlkYWQNCmZlY2hhc19lc3BlY2lhbGVzMiA8LSByZWFkLmNzdigiLi9kYXRvcy9kaWFzX2Zlc3Rpdm9zXzIuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVCkNCg0KI2NvbnZlcnRpciBhIGRhdGUNCmZlY2hhc19lc3BlY2lhbGVzMiRGRUNIQSA8LSBhcy5EYXRlKGZlY2hhc19lc3BlY2lhbGVzMiRGRUNIQSwgZm9ybWF0PSIlZC8lbS8lWSIpI2HDsW8sbWVzLGRpYQ0KDQpjbGFzcyhiYXNlMiRGRUNIQSkNCmNsYXNzKGZlY2hhc19lc3BlY2lhbGVzMiRGRUNIQSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30NCmJhc2UyIDwtIGxlZnRfam9pbihiYXNlMiwgZHBseXI6OnNlbGVjdChmZWNoYXNfZXNwZWNpYWxlczIsRkVDSEEsVElQT19GRVNUSVZJREFEKSwgDQogICAgICAgICAgICAgICAgICBieSA9IGMoIkZFQ0hBIiA9ICJGRUNIQSIpKQ0KDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9DQpiYXNlMiRUSVBPX0ZFU1RJVklEQUQgPC0gZmFjdG9yKGJhc2UyJFRJUE9fRkVTVElWSURBRCwgbGV2ZWxzID0gYygiQV9OVUVWTyIsIkJSVUpBUyIsIkZFU1RJVk8iLCJNQURSRVMiLCJOQVZJREFEIiwiU0VNX1NBTlRBIiwiTm9fZmVzdGl2byIpKSANCmJhc2UyJFRJUE9fRkVTVElWSURBRFtpcy5uYShiYXNlMiRUSVBPX0ZFU1RJVklEQUQpXSA8LSAiTm9fZmVzdGl2byINCg0KDQpiYXNlMiRUSVBPX0ZFU1RJVklEQUQgPC0gYXMuZmFjdG9yKGJhc2UyJFRJUE9fRkVTVElWSURBRCkNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQ0KI0VKRUNVVEFSIFNPTE8gUEFSQSBDUkVBUiBFTCBDU1YgTlVFVk8NCiN3cml0ZS5jc3YoYmFzZTIsIi4vZGF0b3MvYmFzZV9kZXB1cmFkYS5jc3YiLGZpbGVFbmNvZGluZyA9ICJVVEYtOCIpDQpgYGANCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkx1ZWdvIGRlIHJlYWxpemFyIHRvZG8gZWwgcHJlIHByb2Nlc2FtaWVudG8gYSBsYSBiYXNlIGRlIGRhdG9zLCBwb2RlbW9zIG9ic2VydmFyIG1lZGlhbnRlIGxhIHNpZ3VpZW50ZSB0YWJsYSBjdWFsIGZ1ZSBlbCByZXN1bHRhZG8gZmluYWwuDQo8L2Rpdj4NCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9DQpoZWFkKGJhc2UyLG49NSkNCmBgYA0KDQo8L2JyPg0KPC9icj4NCjwvYnI+DQo8L2JyPg0KDQoNCiMjIDIuIEFuw6FsaXNpcyBkZXNjcmlwdGl2bw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkVuIGVzdGEgc2VjY2nDs24gcmVhbGl6YXJlbW9zIGVsIGFuw6FsaXNpcyBkZXNjcmlwdGl2byBwb3IgbGFzIHZhcmlhYmxlcyBxdWUgY29uc2lkZXJhbW9zIHF1ZSByZXByZXNlbnRhbiB1bmEgZGVzY3JpcGNpw7NuIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGRhdG9zIGEgbG8gbGFyZ28gZGVsIHBlcmlvZG8gY29udGVuaWRvLCBjb24gZWwgZmluIGRlIHZlciBjdcOhbCBlcyBlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgZGF0b3MuDQo8L2Rpdj4NCg0KIyMjIDIuMSBBY2NpZGVudGVzIG1lbnN1YWxlcyBwb3IgQcOxbw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KPC9kaXY+DQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQpiZF9maW5hbCA8LSBiYXNlMg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFfQ0KDQphY2NpZGVudGVzX21lc19hbm8gPC0gYmRfZmluYWwgJT4lIGdyb3VwX2J5KEZFQ0hBKSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpemUobnVtZXJvX2RlX2FjY2lkZW50ZXMgPSBuKCkpDQphY2NpZGVudGVzX21lc19hbm8kYW5vIDwtIHllYXIoYWNjaWRlbnRlc19tZXNfYW5vJEZFQ0hBKQ0KYWNjaWRlbnRlc19tZXNfYW5vJG1lcyA8LSBtb250aChhY2NpZGVudGVzX21lc19hbm8kRkVDSEEpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQphZ2dyZWdhdGUobnVtZXJvX2RlX2FjY2lkZW50ZXN+YW5vKm1lcywgZGF0YSA9IGFjY2lkZW50ZXNfbWVzX2FubywgRlVOID0gbWVhbikgJT4lDQogIHBsb3RfbHkoeCA9IH5tZXMsDQogICAgICAgICAgeSA9IH5udW1lcm9fZGVfYWNjaWRlbnRlcywgdHlwZSA9ICJzY2F0dGVyIiwgbW9kZSA9ICJsaW5lcyttYXJrZXJzIiwNCiAgICAgICAgICBzcGxpdCA9IH5hbm8sIGxpbmUgPSBsaXN0KHdpZHRoID0gMS41KSkgJT4lDQogIGxheW91dCh0aXRsZSA9ICdQcm9tZWRpbyBhY2NpZGVudGVzIG1lbnN1YWxlcyBwb3IgYcOxbycsDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVzIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTsO6bWVybyBkZSBhY2NpZGVudGVzIikpDQpgYGANCg0KDQojIyMgMi4yIEFjY2lkZW50ZXMgcG9yIGTDrWEgZGUgbGEgc2VtYW5hDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KPC9kaXY+DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFfQ0KYWNjaWRlbnRlc19zZW1hbmEgPC0gYmRfZmluYWwgJT4lDQogIGdyb3VwX2J5KERJQV9TRU1BTkEpICU+JQ0KICBzdW1tYXJpc2UobnVtZXJvX2RlX2FjY2lkZW50ZXMgPSBuKCkpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQphY2NpZGVudGVzX3NlbWFuYSRESUFfU0VNQU5BIDwtIG9yZGVyZWQoYWNjaWRlbnRlc19zZW1hbmEkRElBX1NFTUFOQSwgbGV2ZWxzID0gYygibHVuZXMiLCJtYXJ0ZXMiLCJtacOpcmNvbGVzIiwianVldmVzIiwidmllcm5lcyIsInPDoWJhZG8iLCJkb21pbmdvIikpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQpncmFmaWNvX2RpYV9zZW1hbmEgPC0gZ2dwbG90KGFjY2lkZW50ZXNfc2VtYW5hLCBhZXMoZmlsbCA9IERJQV9TRU1BTkEsIHggPSBESUFfU0VNQU5BLCB5ID0gbnVtZXJvX2RlX2FjY2lkZW50ZXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMoeSA9IG51bWVyb19kZV9hY2NpZGVudGVzLCBsYWJlbCA9IG51bWVyb19kZV9hY2NpZGVudGVzKSwgdmp1c3QgPSAtMC41KSArDQogIHhsYWIoIkTDrWEiKSArIA0KICB5bGFiKCJOw7ptZXJvIGRlIGFjY2lkZW50ZXMgIikgKyANCiAgZ2d0aXRsZSgiTsO6bWVybyBkZSBhY2NpZGVudGVzIHBvciBkw61hIGRlIGxhIHNlbWFuYSIpICsNCiAgeWxpbShjKDAsNDUwMDApKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiRMOtYSBkZSBsYSBzZW1hbmEiKSkrDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQoNCmdyYWZpY29fZGlhX3NlbWFuYQ0KYGBgDQoNCg0KIyMjIDIuMyBBY2NpZGVudGVzIHBvciBtZXMNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCjwvZGl2Pg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmFjY2lkZW50ZXNfbWVzIDwtIGJkX2ZpbmFsICU+JQ0KICBncm91cF9ieShNRVMpICU+JQ0KICBzdW1tYXJpc2UobnVtZXJvX2RlX2FjY2lkZW50ZXMgPSBuKCkpIA0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFfQ0KYWNjaWRlbnRlc19tZXMkTUVTIDwtIGdzdWIoIjEiLCJFbmVybyIsYWNjaWRlbnRlc19tZXMkTUVTKQ0KYWNjaWRlbnRlc19tZXMkTUVTIDwtIGdzdWIoIjIiLCJGZWJyZXJvIixhY2NpZGVudGVzX21lcyRNRVMpDQphY2NpZGVudGVzX21lcyRNRVMgPC0gZ3N1YigiMyIsIk1hcnpvIixhY2NpZGVudGVzX21lcyRNRVMpDQphY2NpZGVudGVzX21lcyRNRVMgPC0gZ3N1YigiNCIsIkFicmlsIixhY2NpZGVudGVzX21lcyRNRVMpDQphY2NpZGVudGVzX21lcyRNRVMgPC0gZ3N1YigiNSIsIk1heW8iLGFjY2lkZW50ZXNfbWVzJE1FUykNCmFjY2lkZW50ZXNfbWVzJE1FUyA8LSBnc3ViKCI2IiwiSnVuaW8iLGFjY2lkZW50ZXNfbWVzJE1FUykNCmFjY2lkZW50ZXNfbWVzJE1FUyA8LSBnc3ViKCI3IiwiSnVsaW8iLGFjY2lkZW50ZXNfbWVzJE1FUykNCmFjY2lkZW50ZXNfbWVzJE1FUyA8LSBnc3ViKCI4IiwiQWdvc3RvIixhY2NpZGVudGVzX21lcyRNRVMpDQphY2NpZGVudGVzX21lcyRNRVMgPC0gZ3N1YigiOSIsIlNlcHRpZW1icmUiLGFjY2lkZW50ZXNfbWVzJE1FUykNCmFjY2lkZW50ZXNfbWVzJE1FUyA8LSBnc3ViKCJFbmVybzAiLCJPY3R1YnJlIixhY2NpZGVudGVzX21lcyRNRVMpDQphY2NpZGVudGVzX21lcyRNRVMgPC0gZ3N1YigiRW5lcm9FbmVybyIsIk5vdmllbWJyZSIsYWNjaWRlbnRlc19tZXMkTUVTKQ0KYWNjaWRlbnRlc19tZXMkTUVTIDwtIGdzdWIoIkVuZXJvRmVicmVybyIsIkRpY2llbWJyZSIsYWNjaWRlbnRlc19tZXMkTUVTKQ0KDQphY2NpZGVudGVzX21lcyRNRVMgPC0gb3JkZXJlZChhY2NpZGVudGVzX21lcyRNRVMsIGxldmVscyA9IGMoIkVuZXJvIiwiRmVicmVybyIsIk1hcnpvIiwiQWJyaWwiLCJNYXlvIiwiSnVuaW8iLCJKdWxpbyIsIkFnb3N0byIsIlNlcHRpZW1icmUiLCJPY3R1YnJlIiwiTm92aWVtYnJlIiwiRGljaWVtYnJlIikpDQoNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBhY2NpZGVudGVzX21lcywgYWVzKGZpbGw9TUVTLCB4ID0gTUVTLCB5ID0gbnVtZXJvX2RlX2FjY2lkZW50ZXMpKSArIA0KICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogICAgc2NhbGVfZmlsbF9odWUoKSArDQogICAgZ2VvbV90ZXh0KGFlcyh5ID0gbnVtZXJvX2RlX2FjY2lkZW50ZXMsIGxhYmVsID0gbnVtZXJvX2RlX2FjY2lkZW50ZXMpLCB2anVzdCA9IC0wLjUpICsNCiAgICB4bGFiKCJNZXMiKSArDQogICAgeWxhYigiTsO6bWVybyBkZSBhY2NpZGVudGVzIikgKw0KICAgIHlsaW0oYygwLDI2MDAwKSkgKw0KICAgIGdndGl0bGUoIk7Dum1lcm8gZGUgYWNjaWRlbnRlcyBwb3IgbWVzIikrDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAwKSkNCiAgICANCg0KDQoNCg0KYGBgDQoNCg0KDQojIyMgMi40IEFjY2lkZW50ZXMgcG9yIGHDsW8NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCjwvZGl2Pg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmFjY2lkZW50ZV9hw7FvIDwtIHRhYmxlKGJkX2ZpbmFsJEFOTykgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmdncGxvdChkYXRhID0gYWNjaWRlbnRlX2HDsW8sIGFlcyhmaWxsID0gVmFyMSwgeCA9IFZhcjEsIHkgPSBGcmVxKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKHkgPSBGcmVxLCBsYWJlbCA9IEZyZXEpLCB2anVzdCA9IC0wLjUpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKyANCiAgeGxhYigiQcOxbyIpICsNCiAgeWxhYigiTsO6bWVybyBkZSBhY2NpZGVudGVzIikgKw0KICB5bGltKGMoMCw1MDAwMCkpICsNCiAgZ2d0aXRsZSgiTsO6bWVybyBkZSBhY2NpZGVudGVzIHBvciBhw7FvIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQcOxbyIpKQ0KYGBgDQoNCg0KDQojIyMgMi41IEFjY2lkZW50ZXMgcG9yIGNvbXVuYQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCjwvZGl2Pg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmFjY2lkZW50ZXNfY29tdW5hIDwtIGJkX2ZpbmFsICU+JQ0KICBncm91cF9ieShDT01VTkEpICU+JSANCiAgZHBseXI6OnN1bW1hcml6ZShudW1lcm9fZGVfYWNjaWRlbnRlcyA9IG4oKSkNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBhY2NpZGVudGVzX2NvbXVuYSwgYWVzKCBmaWxsID0gQ09NVU5BLCB4ID0gcmVvcmRlcihDT01VTkEsK251bWVyb19kZV9hY2NpZGVudGVzKSwgeSA9IG51bWVyb19kZV9hY2NpZGVudGVzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZCggb3B0aW9uID0gIkMiKSArDQogIGdlb21fdGV4dChhZXMoeSA9IG51bWVyb19kZV9hY2NpZGVudGVzLCBsYWJlbCA9IG51bWVyb19kZV9hY2NpZGVudGVzKSwgaGp1c3QgPSAtMC4xKSArDQogIHhsYWIoIkNvbXVuYSIpICsgDQogIHlsYWIoIk7Dum1lcm8gZGUgYWNjaWRlbnRlcyIpICsNCiAgZ2d0aXRsZSgiTsO6bWVybyBkZSBhY2NpZGVudGVzIHBvciBjb211bmEiKSArDQogIHlsaW0oYygwLDYwMDAwKSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSxsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KDQojIyMgMi42IEFjY2lkZW50ZXMgcG9yIGdyYXZlZGFkDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQo8ZGl2Lz4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQphY2NpZGVudGVzX2dyYXZlZGFkIDwtIGJkX2ZpbmFsICU+JQ0KICBncm91cF9ieShHUkFWRURBRCkgJT4lDQogIHN1bW1hcmlzZShudW1lcm9fZGVfYWNjaWRlbnRlcyA9IG4oKSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmdncGxvdChkYXRhID0gYWNjaWRlbnRlc19ncmF2ZWRhZCwgYWVzKGZpbGwgPSBHUkFWRURBRCwgeCA9IEdSQVZFREFELCB5ID0gbnVtZXJvX2RlX2FjY2lkZW50ZXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMoeSA9IG51bWVyb19kZV9hY2NpZGVudGVzLCBsYWJlbCA9IG51bWVyb19kZV9hY2NpZGVudGVzKSwgdmp1c3QgPSAtMC41KSArDQogIHhsYWIoIkdyYXZlZGFkIikgKyANCiAgeWxhYigiTsO6bWVybyBkZSBhY2NjaWRlbnRlcyIpICsgDQogIGdndGl0bGUoIk7Dum1lcm8gZGUgYWNjaWRlbnRlcyBwb3IgZ3JhdmVkYWQiKSArDQogIHlsaW0oYygwLDE1MDAwMCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSxsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQogIA0KYGBgDQoNCg0KIyMjIDIuNyBBY2NpZGVudGVzIHBvciB0aXBvIGRlIGZlc3RpdmlkYWQNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCjwvZGl2Pg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmFjY2lkZW50ZXNfdGlwb19mZXN0aXZpZGFkIDwtIGJkX2ZpbmFsICU+JQ0KICBncm91cF9ieShUSVBPX0ZFU1RJVklEQUQpICU+JQ0KICBzdW1tYXJpc2UobnVtZXJvX2RlX2FjY2lkZW50ZXMgPSBuKCkpDQoNCmFjY2lkZW50ZXNfdGlwb19mZXN0aXZpZGFkIDwtIGFjY2lkZW50ZXNfdGlwb19mZXN0aXZpZGFkW2MoMSwyLDMsNCw1LDYpLF0NCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmFjY2lkZW50ZXNfdGlwb19mZXN0aXZpZGFkJFRJUE9fRkVTVElWSURBRCA8LSBnc3ViKCJBX05VRVZPIiwiQcORTyBOVUVWTyIsYWNjaWRlbnRlc190aXBvX2Zlc3RpdmlkYWQkVElQT19GRVNUSVZJREFEKQ0KYWNjaWRlbnRlc190aXBvX2Zlc3RpdmlkYWQkVElQT19GRVNUSVZJREFEIDwtIGdzdWIoIlNFTV9TQU5UQSIsIlNFTUFOQSBTQU5UQSIsYWNjaWRlbnRlc190aXBvX2Zlc3RpdmlkYWQkVElQT19GRVNUSVZJREFEKQ0KYWNjaWRlbnRlc190aXBvX2Zlc3RpdmlkYWQkVElQT19GRVNUSVZJREFEIDwtIGdzdWIoIk1BRFJFUyIsIkRJQSBERSBMQVMgTUFEUkVTIixhY2NpZGVudGVzX3RpcG9fZmVzdGl2aWRhZCRUSVBPX0ZFU1RJVklEQUQpDQphY2NpZGVudGVzX3RpcG9fZmVzdGl2aWRhZCRUSVBPX0ZFU1RJVklEQUQgPC0gZ3N1YigiQlJVSkFTIiwiSEFMTE9XRUVOIixhY2NpZGVudGVzX3RpcG9fZmVzdGl2aWRhZCRUSVBPX0ZFU1RJVklEQUQpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GQUxTRX0NCmdncGxvdChkYXRhID0gYWNjaWRlbnRlc190aXBvX2Zlc3RpdmlkYWQsIGFlcyhmaWxsID0gVElQT19GRVNUSVZJREFELCB4ID0gVElQT19GRVNUSVZJREFELCB5ID0gbnVtZXJvX2RlX2FjY2lkZW50ZXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMoeSA9IG51bWVyb19kZV9hY2NpZGVudGVzLCBsYWJlbCA9IG51bWVyb19kZV9hY2NpZGVudGVzKSwgdmp1c3QgPSAtMC41KSArDQogIHhsYWIoIlRpcG8gZGUgZmVzdGl2aWRhZCIpICsgDQogIHlsYWIoIk7Dum1lcm8gZGUgYWNjY2lkZW50ZXMiKSArIA0KICBnZ3RpdGxlKCJOw7ptZXJvIGRlIGFjY2lkZW50ZXMgcG9yIHRpcG8gZGUgZmVzdGl2aWRhZCIpICsNCiAgeWxpbShjKDAsNTAwMCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSxsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQogIA0KYGBgDQoNCg0KQWRlbcOhcyBkZSB2ZXJpZmljYXIgbG9zIGFjY2lkZW50ZXMgcG9yIHRpcG8gZGUgZmVzdGl2aWRhZCwgdGFtYmnDqW4gaGFyZW1vcyByZXZpc2nDs24gZGUgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgZGF0b3MgcmVzcGVjdG8gYSBzaSBlbCBkw61hIGRlbCBhY2NpZGVudGUgZXJhIG8gbm8gZmVzdGl2by4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQphY2NpZGVudGVzX2Zlc3RpdmlkYWQgPC0gYmRfZmluYWwgJT4lDQogIGdyb3VwX2J5KEZFU1RJVklEQUQpICU+JQ0KICBzdW1tYXJpc2UobnVtZXJvX2RlX2FjY2lkZW50ZXMgPSBuKCkpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGFjY2lkZW50ZXNfZmVzdGl2aWRhZCwgYWVzKGZpbGwgPSBGRVNUSVZJREFELCB4ID0gRkVTVElWSURBRCwgeSA9IG51bWVyb19kZV9hY2NpZGVudGVzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKHkgPSBudW1lcm9fZGVfYWNjaWRlbnRlcywgbGFiZWwgPSBudW1lcm9fZGVfYWNjaWRlbnRlcyksIHZqdXN0ID0gLTAuNSkgKw0KICB4bGFiKCJGZXN0aXZvIikgKyANCiAgeWxhYigiTsO6bWVybyBkZSBhY2NjaWRlbnRlcyIpICsgDQogIGdndGl0bGUoIk7Dum1lcm8gZGUgYWNjaWRlbnRlcyBlbiBkw61hcyBmZXJpYWRvcyIpICsNCiAgeWxpbShjKDAsMjUwMDAwKSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQoNCg0KIyMgUmVmZXJlbmNpYXMNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KW0dlby1NZWRlbGzDrW5dKGh0dHBzOi8vZ2VvbWVkZWxsaW4tbS1tZWRlbGxpbi5vcGVuZGF0YS5hcmNnaXMuY29tL2RhdGFzZXRzL00tTWVkZWxsaW46OmxpbWl0ZS1iYXJyaW8tdmVyZWRhLWNhdGFzdHJhbC9hYm91dCkNCjwvYnI+DQpbU3RhY2tvdmVyZmxvd10oaHR0cHM6Ly9lcy5zdGFja292ZXJmbG93LmNvbS8pDQo8L2JyPg0KW1Bsb3RseV0oaHR0cHM6Ly9wbG90bHkuY29tL3IpDQo8L2JyPg0KW2dncGxvdDItYm9vay5vcmddKGh0dHBzOi8vZ2dwbG90Mi1ib29rLm9yZy9zY2FsZS1jb2xvdXIuaHRtbCkNCjwvYnI+DQo8L2Rpdj4NCg0KDQoNCg0KDQoNCg0KDQoNCg==